<?php
    /**
     * 框架名字（Framework name）：    XwenPHP
     * 框架作者（********Author）：    卢学文
     * 创建时间（****CreateDate）：    2017-11-27
     * 版权所有（*****Copyright）：    Copyright Holder lauwen
     * 联系邮箱（********E-mail）：    lauwencn@gmail.com
     */

    function print_const(){
        $const = get_defined_constants(true);
        P($const['user']);
    }


    function halt($error, $level = 'ERROR', $type = 3, $dest = NULL){
        if(is_array($error)){
            Log::write($error['message'],$level,$type,$dest);
        }else{
            Log::write($error,$level,$type,$dest);
        }

        $e = array();
        if(DEBUG){
            if(!is_array($error)){
                $trace = debug_backtrace();
                $e['message'] = $error;
                $e['file'] = $trace[0]['file'];
                $e['line'] = $trace[0]['line'];
                $e['class'] = isset($trace[0]['class']) ? $trace[0]['class'] : '';
                $e['function'] = isset($trace[0]['function']) ? $trace[0]['function'] : '';
                $e['level'] = $level;
                ob_start();
                debug_print_backtrace();
                $e['trace'] = htmlspecialchars(ob_get_clean()); 

                // P($trace);
            }else{
                $e = $error;
            }
        }else{
            if($url = C('ERROR_URL')){
                go($url);
            }else{
                $e['message'] = C('ERROR_MSG');
            }
        }
        include XTPL_PATH.'/half.html';
        die;
    }
    
    /**
     * 跳转函数
     * 参数为$url:跳转地址；$time:跳转等待时间；$msg:跳转提示
     */
    function go($url,$time,$msg){
        if(!headers_sent()){
            $time == 0 ? header('Location:'.$url) : header("refresh:{$time};url={$url}");
            die($msg);
        }else{
            echo "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
            if($time) die($msg);
        }
    }

    /**
     * 变量输出函数
     * 支持变量类型：boolean/array/null等等
     */
    function P($input){
        echo '<pre style="padding:10px;border:1px solid #cccccc;border-radius:5px;background-color:#f5f5f5;font-size:16px;">';
        if(is_null($input)){
            var_dump($input);
        }elseif(is_bool($input)){
            var_dump($input);
        }else{
            print_r($input);
        }
        echo '</pre>';
    }

    /**
     * 加载配置项
     * 1.如果传入的值为单个数组，则和之前加载的配置项合并，越后加载的优先级高
     * 2.如果传入的值为字符串（当只有一个参数时，根据原有配置项文件中是否已经存在该配置项来返回）
     * 3.如果传入的值为字符串（当有两个参数时，将两个参数组成的键值对存入配置项中）
     * 4.如果传入的两个值都为空时，直接返回原有配置项
     */
    function C($var = NULL,$value = NULL){
        static $config = array();
        //传入的值为一个数组，合并
        if(is_array($var)){
            $config = array_merge($config,array_change_key_case($var,CASE_UPPER));
            return;
        }
        //传入的值为字符串
        if(is_string($var)){
            //将字符串转化为大写（配置文件键值为大写）
            $var = strtoupper($var);        
            //如果传入了两个参数，则把传入的参数作为键值对存入配置项中，然后返回
            if(!is_null($value)){
                //key=>value
                $config[$var] = $value;
                return;
            }
            //如果传入的值只有一个则判断加载的配置文件中是否有该配置项，有则返回该配置项，没有则直接返回空；
            return isset($config[$var]) ? $config[$var] : NULL;
        }
        //参数为空，返回原有配置项
        if(is_null($var) && is_null($value)){
            return $config;
        }
    }



?>